package com.zh.simple;

import lombok.Getter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;

import static com.zh.simple.support.SpringContextHolder.getProperty;

/**
 * Hello world!
 * curl http://localhost:8080/actuator/health
 * 打包为docker镜像命令：
 *  docker build --build-arg jar_file=target/demo_simple-1.0.jar -t demo/simple
 */
@SpringBootApplication
public class App {
    @Getter
    static String[] appArgs;

    public static void main(String[] args) {
        appArgs = args;
        SpringApplication.run(App.class, args);
        System.err.printf("application startup success... [server.port=%s, spring.profiles.active=%s]%n", getProperty("server.port"), getProperty("spring.profiles.active"));
    }

    // ContextRefreshedEvent事件是Spring框架触发的标准事件，它发生在ApplicationContext被初始化并刷新完成后，context完全可用。
    // 当你启动一个SpringBoot应用时，Spring容器会首先初始化，然后加载bean，最后触发ContextRefreshedEvent事件。
    @EventListener(ContextRefreshedEvent.class)
    public void listenerContextRefreshedEvent(ContextRefreshedEvent event) {
        System.out.println(Thread.currentThread().getName()+" - ContextRefreshed ... 触发（SpringContext容器已经刷新完成）");
    }

    // ApplicationReadyEvent是一个事件，它在Spring Boot应用启动并完全初始化后被发布。
    // 这意味着所有配置都已加载，所有的bean都已经被创建，并且所有的命令行运行器（CommandLineRunner）和应用程序运行器（ApplicationRunner）都已经执行。
    // 这对于需要在应用完全启动后执行某些操作的场景非常有用。
    @EventListener(ApplicationReadyEvent.class)
    public void listenerApplicationReadyEvent(ApplicationReadyEvent event) {
        System.out.println(Thread.currentThread().getName()+" - Application Ready... 触发（Application应用启动并完全初始化后）");
    }
}
